package com.niit.session12;

public class TestAnimal {
	public static void main(String[] args) {
//		多态的前提3：父类的引用指向子类的对象
		Animal animal = new Cat();
//		多态中调用变量的特点：编译看左边，执行也看左边
		System.out.println(animal.name);
//		多态中方法调用的特点：编译看左边，执行看右边
		animal.yelling();
//		向上的类型转换
		Animal dog = new Dog();
//		在多态的定义的方式里，无法调用子类特有的方法
//		dog.watchHouse();
		long k = 10;
//		把高精度的数据转换成低精度的数据，需要通过强制的类型转换，可能会丢失精度
		int i =(int) k;
//		在强转之前需要做好判断，判断这个变量里装的是猫还是狗
		if(dog instanceof Dog) {
//		如果想要把多态的对象转换回子类，需要通过类型的强制转换，也存在风险
			Dog d = (Dog) dog;
			d.watchHouse();
		}else {
			System.out.println("变量里不是Dog类型，无法完成转换");
		}
		
		
	}
}
class Dog extends Animal{
	String name = "旺财";
	@Override
	public void yelling() {
		System.out.println("汪汪~");
	}
	
	public void watchHouse() {
		System.out.println("看家");
	}
}
class Animal{
	String name = "动物";
	public void yelling() {
		System.out.println("动物发出了不可描述的声音！");
	}
	
}
//多态前提1：存在继承
class Cat extends Animal{
	String name = "猫";
//多态前提2：有方法的重写
	@Override
	public void yelling() {
		System.out.println("喵~");
	}
}



